#!/bin/sh
set -e
set -x

[ ! -d /root/.ethereum/geth/chaindata ] && geth init /config/genesis.json
HOSTNAME=`hostname -i`
[ $RPC ] && RPCOPT="--rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi eth,net,web3,admin,personal"
[ $WS ] && WSOPT="--ws --wsaddr 0.0.0.0"
[ $SINGER ] && MINE="--mine --etherbase $ACCOUNT --unlock $ACCOUNT --password /config/password"
[ $NETWORKID ] && NETWORK="--networkid $NETWORKID"
ENODE=`bootnode --nodekey=/bootnode_keys/boot.key -writeaddress`

while true
do
  BOOTNODEIP=`ping -c 1 bootnode|awk -F '[()]' 'NR==1{print $2}'`
  if [ ! -z $BOOTNODEIP ];then
    break
  fi
done

: <<'EOF'
docker swarm中启动的容器有三张网卡：eth0, eth1, eth2
eth0为自定义的overlay网络（如果compose.yml文件中没有自定义网络，会自动创建），容器中的IP地址会自动分配为如：10.0.1.0/24
eth1为swarm中的ingress网络，IP网段信息可使用命令：docker network inspect ingress
eth2为swarm中的docker_gwbridge网络，网段为：172.xxx.xxx.xxx
以太坊网络通信使用的是eth0网卡，但在容器中ping bootnode节点（如IP为10.0.1.9）时获取到的IP地址得到的结果为：10.0.1.8
所以下面从ping中获取到bootnode的ip地址后，再此基础上加+1得到bootnode节点的IP地址
EOF

ipnum=0
ip2num() {
  local ip=$1
  local a=$(echo $ip | awk -F '.' '{print $1}')
  local b=$(echo $ip | awk -F '.' '{print $2}')
  local c=$(echo $ip | awk -F '.' '{print $3}')
  local d=$(echo $ip | awk -F '.' '{print $4}')
  #echo "$(( (a<<24)+(b<<16)+(c<<8)+d ))"
  ipnum="$(( (a<<24)+(b<<16)+(c<<8)+d ))"
  echo ${ipnum}
}
ip2num $BOOTNODEIP
newipnum=`expr ${ipnum} + 1`

newip=0
num2ip() {
  local num=$1
  local a=$((num>>24))
  local b=$((num>>16&0xff))
  local c=$((num>>8&0xff))
  local d=$((num&0xff))
  newip="$a.$b.$c.$d"
}
num2ip $newipnum

echo "----------------> bootnodeip is: ${BOOTNODEIP} ------------------------>"

#BOOTNODE="--bootnodes enode://$ENODE@[$BOOTNODEIP]:30301"
BOOTNODE="--bootnodes enode://$ENODE@[$newip]:30301"

KEYSTORE=/root/.ethereum/keystore
cp /config/keystore/* $KEYSTORE

geth \
    $RPCOPT  --rpccorsdomain "*" \
    $WSOPT \
    $MINE \
    $NETWORK \
    $BOOTNODE \
    --verbosity $LOGGING_LEVEL
